/**
 * File: queue.c
 * 基于数组实现固定容量的队列
 */

#include "queue.h"

void *init_queue(void) // 初始化空队列
{
  Queue *queue;
  queue = (Queue *)malloc(sizeof(Queue));
  queue->size = 0;
  queue->front = 0;
  queue->nums = (int *)malloc(sizeof(int) * MAX_SIZE);
}

int get_length(Queue *queue) // 获取队列长度
{
  return queue->size;
}

bool is_empty(Queue *queue) // 判断队列是否为空
{
  return get_length(queue) == 0;
}

void push(Queue *queue, int value) // 入队，在数组末尾追加元素
{
  int len = get_length(queue);
  if (len == MAX_SIZE) 
  {
    puts("队列已满");
    return;
  }
  int index = (len + queue->front) % MAX_SIZE;
  queue->nums[index] = value;
  queue->size++;
}

int peek(Queue *queue) // 访问队首元素的值
{
  assert(get_length(queue) > 0 && get_length(queue) <= MAX_SIZE);
  return queue->nums[queue->front];
}

int pop(Queue *queue) // 出队，删除队首元素
{
  int val = peek(queue);
  queue->front++;
  queue->front %= MAX_SIZE;
  queue->size--;
  return val;
}

void print_queue(Queue *queue) // 打印队列
{
  puts("From head to tail:");
  printf("{ ");
  int index;
  for (int i = 0; i < get_length(queue); i++) 
  {
    index = (queue->front + i) % MAX_SIZE;
    if (index == queue->front) printf("%d", queue->nums[index]);
    else printf(", %d", queue->nums[index]);
  }
  puts(" }");
}

void destory_queue(Queue *queue) // 销毁
{
  free(queue->nums);
  free(queue);
}